package cn.itcast.nems.studentrecord.dao.entity;

import cn.itcast.nems.common.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.time.LocalDateTime;

/**
 * <p>
 * 学籍
 * </p>
 *
 * @author liyong
 * @since 2023-11-15
 */
@Getter
@Setter
@TableName("e2_student_record")
@ToString(callSuper = true)
public class StudentRecord extends BaseEntity {

    /**
     * 学籍ID;6位大写字母+数字混合
     */
    private String id;

    /**
     * 学籍来源;枚举值：新报名｜NEW、升班｜RENEWAL、转班来｜TRANSFER、休学归来｜SUSPENSION、出待定班｜DELAY
     */
    private String source;

    /**
     * 班级ID
     */
    private Integer clazzId;

    /**
     * 班级名称
     */
    private String clazzName;

    /**
     * 状态;枚举值：未生效｜PENDING、生效｜VALID
     */
    private String state;

    /**
     * 班级执行价格;班级标准执行价格。如果有多个阶段，此字段也应只记录整个班级的执行价格，而不是单个阶段的执行价格。单位：分
     */
    private Integer price;

    /**
     * 优惠金额;注：如果是基于整单的优惠，优惠金额应分摊到订单行上！所有阶段优惠金额的合计！单位：分
     */
    private Integer discountAmount;

    /**
     * 应付金额;应付金额=原金额-优惠金额。所有阶段应付金额的合计！单位：分
     */
    private Integer amountDue;

    /**
     * 调整金额;有调价单金额累加
     */
    private Integer adjustmentAmount;

    /**
     * 实际应付金额;应付金额-调整金额，但可根据实际业务情况调整。如，基于现有业务规则同学科转班就算有差价也无需补差价，此时该金额就等于上一个学籍结余的金额
     */
    private Integer actualAmountDue;

    /**
     * 转班转入金额;注：来自转班凭单，由其他学籍转进来金额。
     */
    private Integer transferFromAmount;

    /**
     * 已付金额;注：不包括其他班转入的金额，需要将订单整单金额分摊到学籍上。特别注意此金额需要给基于订单头行来计算。所有阶段金额的合计！调价单等订单之外的支付也需要合计！
     */
    private Integer paidAmount;

    /**
     * 剩余应付金额，实际应付 + 退费金额 - 已付金额 - 转班转入金额
     */
    private Integer balanceAmountDue;

    /**
     * 退费金额
     */
    private Integer refundAmount;

    /**
     * 进班日期;未生效学籍不存在进班日期
     */
    private LocalDateTime inDate;

    /**
     * 出班结算日期;退学、转班、进待定班、结课等出班的操作都应记录该值。
     */
    private LocalDateTime settlementDate;

    /**
     * 出班结算原因; 见值ReferenceTypeEnum枚举值
     */
    private String settlementReason;

    /**
     * 出班结算实际结算金额;结算金额 = 课时费 = 结算天数*(实际应付金额/课程天数)
     */
    private Integer settlementAmount;

    /**
     * 转出金额 = SUM(费用转出金额) + 转班转出金额；转班转出金额 = 已付金额 + 转入金额 - SUM(费用转出金额) - 退费金额 - 课耗金额（在转班相关凭单审批通过时计算，不可为负数，负数时该值为0）
     */
    private Integer transferOutAmount;

    /**
     * 出班结算实际结算天数;结算天数 = 上课天数（出班日期-入班日期）
     */
    private Integer settlementDays;

    /**
     * 学籍备注
     */
    private String remark;

    /**
     * 学籍操作锁;枚举值：0｜无锁、1｜已上锁；场景：处于升班场景中的学籍，不允许再办理转班等其他操作。
     */
    private Boolean lockFlag;

    /**
     * 基础班是否升班标识;枚举值：0｜未升班、1｜已升班。注：只有基础班才有该值
     */
    private Boolean renewalFlag;

    /**
     * 关联学籍ID;记录该学籍来源的上一个学籍ID。比如升班时记录基础班学籍ID，转班时记录转班来源的学籍ID等
     */
    private String associatedRecordId;

    /**
     * 旧EMS学籍ID;注：当前情况有新学籍必然有EMS旧学籍
     */
    private Integer oldEmsRecordId;
    /**
     * 唯一code；为保护学籍ID不泄漏，主要用于该学籍统一的支付链接
     */
    private String uniqueCode;
}
